<script setup lang="ts">
import HandsonTable from 'handsontable'
import { registerAllModules } from 'handsontable/registry'
import 'handsontable/styles/handsontable.css'
import 'handsontable/styles/ht-theme-main.css'
// import 'handsontable/styles/ht-theme-horizon.css'
import '@/style/handsontable-theme.css'
import { registerLanguageDictionary, zhCN } from 'handsontable/i18n'
import { HyperFormula } from 'hyperformula'

import useTheme from '../useTheme'
import { REPORT_FORM_ID, REPORT_ID } from '@/enum/modules/report'
import type { LoadDataResponse } from './type'
import { HEADER_CELL_CLASS, READONLY_CELL_CLASS, ROUND_NUMBER as _ROUND_NUMBER } from '../config'
import useLoadReportDetail from './useLoadReportDetail'

defineOptions({ name: 'SummaryCompanyElectricity1' })
const props = defineProps<{
  time: string
}>()

// 电量电费汇总表精度保留到6位
const ROUND_NUMBER = _ROUND_NUMBER + 2

registerLanguageDictionary(zhCN)

// register Handsontable's modules
registerAllModules()

const HEADERS = [
  [
    '类别',
    '序号',
    '项目',
    '电量（万kwh）',
    null,
    null,
    null,
    '电费（万元）',
    null,
    null,
    null,
    '单价（元/kwh）',
    null,
    null,
  ],
  [
    null,
    null,
    null,
    '上月',
    '本月',
    '上月累计',
    '本月累计',
    '上月',
    '本月',
    '上月累计',
    '本月累计',
    '上月',
    '本月',
    '累计',
  ],
  [
    '电业局结算数',
    // 其他通过公式填充
    ...Array(13).fill(null),
  ],
]

const wrapper = ref<HTMLElement>()
const hot = ref<HandsonTable>()

const newMergeCells = shallowRef<HandsonTable.GridSettings['mergeCells']>(
  [
    { row: 0, col: 0, rowspan: 2, colspan: 1 },
    { row: 0, col: 1, rowspan: 2, colspan: 1 },
    { row: 0, col: 2, rowspan: 2, colspan: 1 },
    { row: 0, col: 3, rowspan: 1, colspan: 4 },
    { row: 0, col: 7, rowspan: 1, colspan: 4 },
    { row: 0, col: 11, rowspan: 1, colspan: 3 },
  ],
)

// 汇总表
// eslint-disable-next-line
const reportId = REPORT_ID.ELECTRICITY_BILL_SUMMARY
const formId = REPORT_FORM_ID.ELECTRICITY_BILL_SUMMARY_1
// 当前企业名称
// const tenantName = ref('')
// 远程数据
const loadDataResponse = shallowRef<LoadDataResponse>()
const { res, loadReportData } = useLoadReportDetail()

// 加载数据
async function loadData() {
  if (!props.time) {
    return
  }
  await loadReportData(props.time, unref(formId))
  const src = loadDataResponse.value = unref(res)

  const dataList = []
  const regionDataList = src?.collect?.regionDataList
  if (regionDataList) {
    // 循环插入区域 regionName
    for (let i = 0; i < regionDataList.length; i++) {
      const item = regionDataList[i]
      const array = []
      array.push(
        i === 0 ? '其中：' : null,
        i + 1,
        item.regionName,
        // 等待用公式填充
        ...Array(11).fill(null),
      )
      dataList.push(array)
    }

    // 插入“公司发行数”行 2025年4月14日 去掉公司发行数这行
    // dataList.push(
    //   [
    //     '公司发行数',
    //     ...Array(13).fill(null),
    //   ],
    // )

    // 循环插入区域对应的数据 collectItemList
    for (let i = 0; i < regionDataList.length; i++) {
      const item = regionDataList[i]
      // 插入“区域”头
      dataList.push(
        [
          item.regionName,
          ...Array(13).fill(null),
        ],
      )
      // 循环插入数据
      for (let j = 0; j < item.collectItemList.length; j++) {
        const array = []
        const v = item.collectItemList[j]
        array.push(
          j === 0 ? '其中' : null,
          j + 1,
          v.name,
          v.lastMonthElectricQuantity,
          v.electricQuantity,
          v.lastMonthTotalElectricQuantity,
          // 本月累计电量 等待公式填充
          null,
          v.lastMonthElectricCharge,
          v.electricCharge,
          v.lastMonthTotalElectricCharge,
          // 本月累计电费 等待公式填充
          null,
          // 单价-上月 等待公式填充
          null,
          // 单价-本月 等待公式填充
          null,
          // 单价-累计 等待公式填充
          null,
        )
        dataList.push(array)
      }
    }
  }

  const data = [
    ...HEADERS,
    ...dataList,
  ]

  // 用公式填充
  if (data.length > HEADERS.length) {
    const formulas = generateFormulas()
    for (const key in formulas) {
      const item = formulas[key as keyof typeof formulas]
      if (item.length) {
        for (const { row, col, exp } of item) {
          data[+row][+col] = exp
        }
      }
    }
  }
  // console.log(data)
  hot.value?.loadData(data)
}

// 生成公式
function generateFormulas() {
  const result = {
    // 区域头的累加公式
    region: [] as { row: number | string, col: number | string, exp: string }[],
    // 公司发行数的累加公式
    company: [] as { row: number | string, col: number | string, exp: string }[],
    // 电业局结算数其中区域所在行公式
    electricity: [] as { row: number | string, col: number | string, exp: string }[],
    // 电业局结算数公式
    electricityBill: [] as { row: number | string, col: number | string, exp: string }[],
    // 本月累计电量列公式
    totalDl: [] as { row: number | string, col: number | string, exp: string }[],
    // 本月电费列公式
    totalDf: [] as { row: number | string, col: number | string, exp: string }[],
    // 上月单价公式
    last: [] as { row: number | string, col: number | string, exp: string }[],
    // 本月单价公式
    current: [] as { row: number | string, col: number | string, exp: string }[],
    // 累计单价公式
    total: [] as { row: number | string, col: number | string, exp: string }[],
  }
  const src = loadDataResponse.value
  const regionDataList = src?.collect?.regionDataList
  // 求每个”区域“头所在行
  if (regionDataList) {
    // 第一个区域头所在行 2025年4月14日去掉公司发行数这行
    let m = 3 + regionDataList.length + 1
    const rows = [m]
    for (let i = 0; i < regionDataList.length; i++) {
      const item = regionDataList[i]
      m += item.collectItemList.length + 1
      rows.push(m)
    }
    // console.log('rows=', rows)

    // D、E、F、H、I、J列（对应的索引3，4，5，7，8，9列）的公式
    const pp = [
      ['D', 3],
      ['E', 4],
      ['F', 5],
      ['H', 7],
      ['I', 8],
      ['J', 9],
    ]
    // 循环求区域头的累加公式
    for (let i = 0; i < rows.length; i++) {
      const x = rows[i]
      const y = rows[i + 1]
      if (x && y) {
        const row = x - 1
        for (const [ss, col] of pp) {
          const formula = `=ROUND(SUM(${ss}${x + 1}:${ss}${y - 1}),${ROUND_NUMBER})`
          // console.log('区域头', formula)
          // hot.value.setSourceDataAtCell(row, col, formula)
          result.region.push({
            row,
            col,
            exp: formula,
          })
        }
      }
    }

    // 循环求公司发行数的累加公式 2025年4月14日去掉公司发行数这行
    // for (const [ss, col] of pp) {
    //   let exp = ''
    //   for (const row of rows.slice(0, -1)) {
    //     exp += `${ss}${row}+`
    //   }
    //   const formula = `=ROUND(${exp.slice(0, -1)},${ROUND_NUMBER})`
    //   // console.log('公司发行数', formula)
    //   result.company.push({
    //     row: rows[0] - 2,
    //     col,
    //     exp: formula,
    //   })
    // }

    // 电业局结算数其中区域所在行公式
    for (const [ss, col] of pp) {
      const start = 3
      let end = start
      for (const r of rows.slice(0, -1)) {
        const formula = `=${ss}${r}`
        // console.log('电业局结算数区域', formula)
        result.electricity.push({
          row: end++,
          col,
          exp: formula,
        })
      }
      // 电业局结算数公式
      const exp = `=ROUND(SUM(${ss}${start + 1}:${ss}${end}),${ROUND_NUMBER})`
      // console.log('电业局结算数', exp)
      result.electricityBill.push({
        row: 2,
        col,
        exp,
      })
    }

    // 本月累计（电量和电费）的公式 = 本月 + 上月累计
    // 单价公式 = 电费 / 电量
    // 上月、本月、累计
    // 从行号为3开始到结束
    let begin = 2
    // 预计总行数 2025年4月14日去掉公司发行数这行
    const total = regionDataList.reduce((acc, vv) => {
      acc += vv.collectItemList.length + 1
      return acc
    }, begin) + 1 + regionDataList.length
    while (++begin <= total) {
      // 本月累计电量
      result.totalDl.push({
        row: begin - 1,
        // G列
        col: 6,
        exp: `=ROUND(E${begin}+F${begin},${ROUND_NUMBER})`,
      })
      // 本月累计电费
      result.totalDf.push({
        row: begin - 1,
        // K列
        col: 10,
        exp: `=ROUND(I${begin}+J${begin},${ROUND_NUMBER})`,
      })
      // 上月单价
      result.last.push({
        row: begin - 1,
        // L列
        col: 11,
        exp: `=IFERROR(ROUND(H${begin}/D${begin},${ROUND_NUMBER}), "")`,
      })
      // 本月单价
      result.current.push({
        row: begin - 1,
        // M列
        col: 12,
        exp: `=IFERROR(ROUND(I${begin}/E${begin},${ROUND_NUMBER}), "")`,
      })
      // 累计单价,这里是本月累计电费/本月累计电量
      result.total.push({
        row: begin - 1,
        // N列
        col: 13,
        exp: `=IFERROR(ROUND(K${begin}/G${begin},${ROUND_NUMBER}), "")`,
      })
    }
  }
  return result
}

// 生成对齐的配置
function createAlign() {
  // 获取内容为”其中“的行
  const src = loadDataResponse.value
  const regionDataList = src?.collect?.regionDataList
  if (regionDataList) {
    // 加上前面三行
    let m = 3
    const rows = [m]
    // 2025年4月14日去掉公司发行数这行
    m += regionDataList.length + 1
    rows.push(m)
    for (let i = 0; i < regionDataList.length; i++) {
      const item = regionDataList[i]
      m += item.collectItemList.length + 1
      rows.push(m)
    }
    // 丢去最后一个
    rows.pop()
    return (row: number, col: number) => {
      if (row < HEADERS.length) {
        return { className: `htCenter htMiddle ${HEADER_CELL_CLASS}` }
      }
      if (col === 0 && row > 1) {
        // 内容为”其中“的单元格居右对齐
        if (row !== 0 && !rows.includes(row)) {
          return { className: 'htLeft' }
        }
        else if (rows.includes(row)) {
          return { className: 'htRight' }
        }
      }
      if (col === 2 && row >= HEADERS.length) {
        return { className: 'htLeft' }
      }
      return {}
    }
  }
}

function updateSettings() {
  if (hot.value) {
    hot.value.updateSettings({
      mergeCells: newMergeCells.value,
      cells: createAlign(),
    })
  }
}

function init() {
  if (!wrapper.value)
    return
  hot.value = new HandsonTable(wrapper.value, {
    fixedRowsTop: HEADERS.length,
    readOnly: true,
    // disableVisualSelection: true,
    data: [...HEADERS],
    language: zhCN.languageCode,
    formulas: {
      engine: HyperFormula,
    },
    className: 'htCenter htMiddle',
    readOnlyCellClassName: READONLY_CELL_CLASS,
    stretchH: 'all',
    // autoColumnSize: true,
    colWidths: 100,
    manualColumnResize: true,
    colHeaders: true,
    rowHeaders: true,
    mergeCells: [],
    licenseKey: 'non-commercial-and-evaluation',
  })

  // debug
  if (import.meta.env.VITE_REPORT_DEBUG === '1') {
    hot.value.addHook('afterSelection', (row, col) => {
      if (row > -1 && col > -1) {
        console.info(`[${row},${col}] ${hot.value?.getSourceDataAtCell(row, col)}`)
        document.execCommand('copy')
      }
    })
  }
}

async function bootstrap() {
  // 初始化实例
  init()
  // 加载数据和配置
  await loadData()
  updateSettings()
}

onMounted(bootstrap)

const { isDark } = useTheme(async () => {
  // 主题切换后，重新初始化实例
  if (hot.value) {
    hot.value.destroy()
    hot.value = undefined
    await bootstrap()
  }
})
</script>

<template>
  <div class="h-full w-full">
    <div
      ref="wrapper" class="h-full w-full overflow-auto" :class="{
        'ht-theme-main-dark': isDark,
        'ht-theme-main': !isDark,
      }"
    />
  </div>
</template>
